package com.deer.wms.api.configurer;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import com.beust.jcommander.internal.Lists;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

/**
 * @author : wei
 * @since : 2021-08-09 11:32:16
 **/
@Configuration
public class MybatisPlusConfig {

    /**
     * 是否开启多租户
     */
    @Value("${tenant.enabled}")
    private Boolean tenantEnabled;

    /**
     * 新多租户插件配置,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存万一出现问题
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        if (tenantEnabled) {
            interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
                /**
                 * 忽略添加租户ID的表
                 */
                private final List<String> IGNORE_TABLE_NAMES = Lists.newArrayList(
                        "co_company",
                        "user_info"
                );

                /**
                 * 获取租户 ID 值表达式(可从cookie、token、缓存中取)，只支持单个 ID 值
                 * <p>
                 *
                 * @return 租户 ID 值表达式
                 */
                @Override
                public Expression getTenantId() {
                    //从token中获取
                    return new LongValue(1L);
                }

                /**
                 * 获取租户字段名
                 * <p>
                 * 默认字段名叫: tenant_id
                 *
                 * @return 租户字段名
                 */
                @Override
                public String getTenantIdColumn() {
                    return TenantLineHandler.super.getTenantIdColumn();
                }

                /**
                 * 根据表名判断是否忽略拼接多租户条件
                 * <p>
                 * 默认都要进行解析并拼接多租户条件
                 *
                 * @param tableName 表名
                 * @return 是否忽略, true:表示忽略，false:需要解析并拼接多租户条件
                 */
                @Override
                public boolean ignoreTable(String tableName) {
                    return IGNORE_TABLE_NAMES.contains(tableName);
                }
            }));
        }
        return interceptor;
    }



}
